package test.utils.json;

public class CharTypes {
	private final static boolean[] specicalFlags_doubleQuotes = new boolean[((int) '\\' + 1)];
	private final static char[] replaceChars = new char[((int) '\\' + 1)];
	static {
		specicalFlags_doubleQuotes['\b'] = true;
		specicalFlags_doubleQuotes['\n'] = true;
		specicalFlags_doubleQuotes['\t'] = true;
		specicalFlags_doubleQuotes['\f'] = true;
		specicalFlags_doubleQuotes['\r'] = true;
		specicalFlags_doubleQuotes['\"'] = true;
		specicalFlags_doubleQuotes['\\'] = true;
		specicalFlags_doubleQuotes['/'] = true;

		replaceChars['\b'] = 'b';
		replaceChars['\n'] = 'n';
		replaceChars['\t'] = 't';
		replaceChars['\f'] = 'f';
		replaceChars['\r'] = 'r';
		replaceChars['\"'] = '"';
		replaceChars['\''] = '\'';
		replaceChars['\\'] = '\\';
		replaceChars['/'] = '/';

	}

	public static String replaceSpecicalFlags(String s) {
		StringBuilder sb = new StringBuilder(s.length() + 10);
		char[] cs = s.toCharArray();
		for (char ch : cs) {
			if (isSpecicalFlags(ch)) {
				sb.append('\\');
				sb.append(replaceChar(ch));
			} else {
				sb.append(ch);
			}
		}
		return sb.toString();
	}

	public static String replaceSpecicalFlags2(String s) {
		StringBuilder sb = new StringBuilder(s.length() + 10);
		char[] cs = s.toCharArray();
		for (char c : cs) {
			switch (c) {
			case '"':
				sb.append("\\\"");
				break;
			case '\b':
				sb.append("\\b");
				break;
			case '\n':
				sb.append("\\n");
				break;
			case '\t':
				sb.append("\\t");
				break;
			case '\f':
				sb.append("\\f");
				break;
			case '\r':
				sb.append("\\r");
				break;
			case '\\':
				sb.append("\\\\");
				break;
			default:
				sb.append(c);
			}
		}
		return sb.toString();
	}

	public static boolean isSpecicalFlags(char ch) {
		return ch < specicalFlags_doubleQuotes.length
				&& specicalFlags_doubleQuotes[ch];
	}

	public static char replaceChar(char ch) {
		return replaceChars[(int) ch];
	}

	public static void main(String[] args) {
		// System.out.println(replaceChars.length);
//		for (char c : replaceChars) {
//			if ((int) c != 0)
//				System.out.print((int) c + " ");
//		}
		String s = "dfdf\t";
		String r = null;
		long start = System.currentTimeMillis();
		for(int i = 0; i < 100000; i++) {
			r = replaceSpecicalFlags(s);
		}
		long end = System.currentTimeMillis();
		System.out.println(end - start);
		System.out.println(r);

		start = System.currentTimeMillis();
		for(int i = 0; i < 100000; i++) {
			r = replaceSpecicalFlags2(s);
		}
		end = System.currentTimeMillis();
		System.out.println(end - start);
		System.out.println(r);

	}
}
